/*********************************************************************
*
*      Copyright (C) 2005 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/

package jxl.biff;

import jxl.WorkbookSettings;

/**
 * Helper to get the Microsoft encoded URL from the given string
 */
public class EncodedURLHelper {

	/**
	 * The logger
	 */
	// private static Logger logger = Logger.getLogger(EncodedURLHelper.class);

	// The control codes
	private static byte msDosDriveLetter = 0x01;
	private static byte sameDrive = 0x02;
	private static byte endOfSubdirectory = 0x03;
	private static byte parentDirectory = 0x04;
	private static byte unencodedUrl = 0x05;

	public static byte[] getEncodedURL(String s, WorkbookSettings ws) {
		if (s.startsWith("http:")) {
			return getURL(s, ws);
		} else {
			return getFile(s, ws);
		}
	}

	private static byte[] getFile(String s, WorkbookSettings ws) {
		ByteArray byteArray = new ByteArray();

		int pos = 0;
		if (s.charAt(1) == ':') {
			// we have a drive letter
			byteArray.add(msDosDriveLetter);
			byteArray.add((byte) s.charAt(0));
			pos = 2;
		} else if (s.charAt(pos) == '\\' || s.charAt(pos) == '/') {
			byteArray.add(sameDrive);
		}

		while (s.charAt(pos) == '\\' || s.charAt(pos) == '/') {
			pos++;
		}

		while (pos < s.length()) {
			int nextSepIndex1 = s.indexOf('/', pos);
			int nextSepIndex2 = s.indexOf('\\', pos);
			int nextSepIndex = 0;
			String nextFileNameComponent = null;

			if (nextSepIndex1 != -1 && nextSepIndex2 != -1) {
				// choose the smallest (ie. nearest) separator
				nextSepIndex = Math.min(nextSepIndex1, nextSepIndex2);
			} else if (nextSepIndex1 == -1 || nextSepIndex2 == -1) {
				// chose the maximum separator
				nextSepIndex = Math.max(nextSepIndex1, nextSepIndex2);
			}

			if (nextSepIndex == -1) {
				// no more separators
				nextFileNameComponent = s.substring(pos);
				pos = s.length();
			} else {
				nextFileNameComponent = s.substring(pos, nextSepIndex);
				pos = nextSepIndex + 1;
			}

			if (nextFileNameComponent.equals(".")) {
				// current directory - do nothing
			} else if (nextFileNameComponent.equals("..")) {
				// parent directory
				byteArray.add(parentDirectory);
			} else {
				// add the filename component
				byteArray.add(StringHelper.getBytes(nextFileNameComponent, ws));
			}

			if (pos < s.length()) {
				byteArray.add(endOfSubdirectory);
			}
		}

		return byteArray.getBytes();
	}

	private static byte[] getURL(String s, WorkbookSettings ws) {
		ByteArray byteArray = new ByteArray();
		byteArray.add(unencodedUrl);
		byteArray.add((byte) s.length());
		byteArray.add(StringHelper.getBytes(s, ws));
		return byteArray.getBytes();
	}
}
